#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
using namespace std;

////////////////////////////////////////////////////////////////////////////////

LecteurSymbole::LecteurSymbole(string nomFich) : lc(nomFich), symCour("") {
    suivant(); // pour lire le premier symbole
}
////////////////////////////////////////////////////////////////////////////////

void LecteurSymbole::suivant() {
    sauterSeparateurs();
    // on est maintenant positionne sur le premier caractère d'un symbole
    ligne = lc.getLigne();
    colonne = lc.getColonne();
    symCour = Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu
}
////////////////////////////////////////////////////////////////////////////////

void LecteurSymbole::sauterSeparateurs() {
    while (lc.getCarCour() == ' ' ||
            lc.getCarCour() == '\t' ||
            lc.getCarCour() == '\r' ||
            lc.getCarCour() == '\n')
        lc.suivant();
}
////////////////////////////////////////////////////////////////////////////////

string LecteurSymbole::motSuivant() {
    static string s;
    s = "";
    if (isdigit(lc.getCarCour()))
        // c'est le début d'un entier
        do {
            s = s + lc.getCarCour();
            lc.suivant();
        } while (isdigit(lc.getCarCour()));

    else if (isalpha(lc.getCarCour()))
        // c'est le début d'un mot
        do {
            s = s + lc.getCarCour();
            lc.suivant();
        } while (isalpha(lc.getCarCour()) ||
                isdigit(lc.getCarCour()) ||
                lc.getCarCour() == '_');

    else if (lc.getCarCour() != EOF)
        // c'est un caractere special
    {
        s = lc.getCarCour(); // ajoute ce caractere
        if (lc.getCarCour() == '.') { // reconnais .. pour les pour
            lc.suivant();
            if (lc.getCarCour() == '.') {
                s = s + lc.getCarCour();
                lc.suivant();
            }
        } else if (lc.getCarCour() == '"') { // reconnait le debut d'une chaine
            do {
                lc.suivant();
                if (lc.getCarCour() != ';' && lc.getCarCour() != '\n') // verifie qu'il n'y a pas d'erreur avant de l'ajouter a la chaine
                    s = s + lc.getCarCour();
            } while (lc.getCarCour() != '"' && lc.getCarCour() != ';' && lc.getCarCour() != '\n'); // while non fini et non erreur
            if (lc.getCarCour() == '"') { // si fini sans erreur ajouter
                lc.suivant();
            }
        }
        else if (lc.getCarCour() == '#') { // reconnait un commentaire
            lc.suivant();
            while (lc.getCarCour() != '\n') { // while pas fin de ligne
                s = s + lc.getCarCour();
                lc.suivant();
            }
        } else if (lc.getCarCour() == '=' || lc.getCarCour() == '!' || lc.getCarCour() == '>' || lc.getCarCour() == '<') { // reconnais un opReel

            lc.suivant(); // mange le  = ou ! ou < ou >
            if (lc.getCarCour() == '=') {
                s = s + lc.getCarCour(); // ajoute le =
                lc.suivant();
            }
        } else { // si c'est indefini
            lc.suivant(); // ne rajoute que UN caractere pour le symbole indefini!!!
        }


    }
    return s;
}
////////////////////////////////////////////////////////////////////////////////

bool LecteurSymbole::iscommentaire() {
    return symCour.iscommentaire();
}
////////////////////////////////////////////////////////////////////////////////